// 作为学生的路由文件
var express = require("express");
var router = express.Router();

// 引入jwt，用于后端生成token
const jwt = require("jsonwebtoken");

// 引入第三方的NodeRSA，用于生成密钥对
const NodeRSA = require("node-rsa");
// 设置密文的最大长度的为1024位
const key = new NodeRSA({ b: 1024 });
// 一种加密的填充方案
key.setOptions({ encryptionScheme: "pkcs1" });

const mongoose = require("mongoose");
// 3. 创建骨架， 定义文档的数据类型
// 主要是用于新增的时候, 只有在骨架里面的字段才可以添加进数据库
const usersSchema = mongoose.Schema({
  username: String,
  password: String,
});

// 4. 创建模型, 模型其实是构造函数，尤其是新增的时候，需要创建出实例然后再去新增，查询或者删除，直接通过模型操作
// 第一个参数是集合名称,(复数)
const Users = mongoose.model("users", usersSchema);

// 预登录接口
router.get("/key", (req, res, next) => {
  let publicKey = key.exportKey("public"); //生成公钥
  // console.log(publicKey);
  res.json({
    publicKey: publicKey,
  });
});

// 登录接口
router.post("/login", (req, res, next) => {
  // info是传过来的密文
  const { info } = req.body;
  // console.log(info);
  // 解密
  let decrypted = key.decrypt(info, "utf8"); //解密
  // console.log(decrypted);

  const { username, password } = JSON.parse(decrypted);

  if (!username || !password) {
    res.json({
      status: 2,
      msg: "参数错误",
    });
  } else {
    Users.findOne({ username }, (err, doc) => {
      if (err) throw err;
      if (doc) {
        if (password === doc.password) {
          // 当登录成功的时候去生成token

          let payload = { username: username };
          let secret = "I_LOVE_JING";
          // 第三个参数可以设置有效时长
          let token = jwt.sign(payload, secret, { expiresIn: 60 * 1 });

          res.json({
            status: 0,
            msg: "登录成功",
            token,
          });
        } else {
          res.json({
            status: 4,
            msg: "密码错误",
          });
        }
      } else {
        res.json({
          status: 3,
          msg: "用户不存在",
        });
      }
    });
  }
});

module.exports = router;
